import math

import pandas


def Ent(D: pandas.Series):
    """
    英文名：information entropy
    中文名：信息熵
    作用：度量样本集合纯度最常用的一种指标。
    特性：
        Ent(D)值越小，集合D纯度越高
        最小为0，最大为math.log(len(gamma), base=2)
        约定：若pk=0,则pk * math.log(pk, base=2)=0

    :param D: list
    """
    gamma = D.value_counts()
    Sigma = 0
    for k in gamma.index:
        pk = gamma[k] / sum(gamma)
        Sigma += pk * math.log(pk, 2)

    return -Sigma


if __name__ == '__main__':
    import sys
    import os

    sys.path.append(os.pardir)

    from table_401_watermelon_set_20 import df

    r = Ent(D=df['好瓜'])
    print(r)
